﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace daq_test_cs
{
    /// <summary>
    /// USB服务器包装类，用于管理USB设备的连接和通信
    /// </summary>
    public class USBServerWrapper
    {
        /// <summary>
        /// 设备类型枚举，定义支持的DAQ设备型号
        /// </summary>
        public enum DeviceType
        {
            DeviceType_DAQ217,  // DAQ217设备类型
            DeviceType_DAQ216,  // DAQ216设备类型
            DeviceType_DAQ207,  // DAQ207设备类型
            DeviceType_DAQ206,  // DAQ206设备类型
            DeviceType_DAQ125,  // DAQ125设备类型
        }

        // 动态库路径
        private const string DllPath = "./libdaq-3.7.1.dll";

        /// <summary>
        /// 创建新的USB服务器实例
        /// </summary>
        /// <param name="device_type">要管理的设备类型</param>
        /// <returns>返回USB服务器实例的指针，失败返回IntPtr.Zero</returns>
        [DllImport(DllPath, CallingConvention = CallingConvention.StdCall)]
        public static extern IntPtr USBServer_New(DeviceType device_type);

        /// <summary>
        /// 删除USB服务器实例，释放相关资源
        /// </summary>
        /// <param name="handle">USB服务器实例的指针</param>
        [DllImport(DllPath, CallingConvention = CallingConvention.StdCall)]
        public static extern void USBServer_Delete(IntPtr handle);

        /// <summary>
        /// 开始搜索USB设备
        /// 调用此函数后，服务器会扫描并发现连接的USB设备
        /// </summary>
        /// <param name="handle">USB服务器实例的指针</param>
        [DllImport(DllPath, CallingConvention = CallingConvention.StdCall)]
        public static extern void USBServer_StartSearch(IntPtr handle);

        /// <summary>
        /// 根据设备索引获取客户端连接
        /// 注意：每次调用此函数获取设备后，总线上的设备指针会减少
        /// 因此在多设备连接时，应始终使用索引0来获取下一个可用设备
        /// </summary>
        /// <param name="handle">USB服务器实例的指针</param>
        /// <param name="device_index">设备索引，多设备连接时建议始终使用0</param>
        /// <returns>返回设备客户端的指针，失败返回IntPtr.Zero</returns>
        [DllImport(DllPath, CallingConvention = CallingConvention.StdCall)]
        public static extern IntPtr USBServer_GetClientByIndex(IntPtr handle, uint device_index);

        /// <summary>
        /// 获取当前发现的设备总数
        /// </summary>
        /// <param name="handle">USB服务器实例的指针</param>
        /// <returns>返回发现的设备数量</returns>
        [DllImport(DllPath, CallingConvention = CallingConvention.StdCall)]
        public static extern uint USBServer_GetDeviceCount(IntPtr handle);
    }
}

